package com.qp.basics.estivate;

import javax.transaction.Transaction;
import java.io.Serializable;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

/**
 * 有点类似hibernate的Session。
 *
 */
public interface Session {
	Database getDatabase();

	void setDatabase(Database database);

	Connection getConnection();

	void close();

	/**
	 * 创建一个Query对象。 看Query的接口定义可知，Query可以查询也可以修改以及删除等。
	 * 
	 * @param sql
	 * @return
	 */
	Query createQuery(String sql);

	// 根据主键或唯一标识获取一个实体，现在虽然定义为Object，但其实只支持Map
	Object get(String tableName, Serializable pk);

	Object get(Table table, Serializable pk);

	Object findByUnique(String tableName, String colName, Object v);

	Object findByUnique(Table table, String colName, Object unique);

	Number queryForNumber(String sql, Object... params);

	Long queryForLong(String sql, Object... params);

	Integer queryForInt(String sql, Object... params);

	Map queryForMap(String sql, Object... params);

	List<Map> queryForList(String sql, Object... params);

	/**
	 * 获取第一条记录的第一个字段。
	 * 
	 * @deprecated
	 * @param sql
	 * @param params
	 * @return
	 */
	Object queryForObject(String sql, Object... params);

	/**
	 * 获取第一条记录的第一个字段，并转化为字符串。
	 * 
	 * @deprecated
	 * @param sql
	 * @param params
	 * @return
	 */
	String queryForString(String sql, Object... params);

	// merge的实现还不ok
	Object merge(String tableName, Map entity);

	Object merge(Table table, Map entity);

	Object insert(Table table, Map entity);

	int update(Table table, Map entity);

	int update(Table table, Map entity, String pkName);

	/**
	 * 根据某唯一字段更新记录，不一定是主键。
	 * 
	 * @deprecated
	 * @param table
	 * @param entity
	 * @param pkName
	 * @param pk
	 * @return
	 */
	int update(Table table, Map entity, String pkName, Object pk);

	Object insert(String tableName, Map entity);

	int update(String tableName, Map entity);

	int update(String tableName, Map entity, String pkName);

	int update(String tableName, Map entity, String pkName, Object pk);

	int update(String tableName, Map entity, String[] compoundKeyArr,
			Object[] keyValueArr);

	// 根据主键
	int delete(String tableName, Serializable pk);

	int delete(Table table, Serializable pk);

	// //根据唯一标识删除，其实代码实现是也没要求是具有唯一性的字段
	int deleteByUnique(String tableName, String colName, Object v);

	int deleteByUnique(Table table, String colName, Object v);

	// 删除实体
	int delete(String tableName, Object entity);

	int delete(Table table, Object entity);

	Transaction beginTransaction();

	Transaction getTransaction();

	void setConnection(Connection connection);

	/**
	 * 批量执行sql语句。
	 * 
	 * @param sqls
	 * @return
	 */
	int[] executeBatch(String[] sqls);

	int executeUpdate(String sql, Object... params);

	int getClosedStatus();

	void setName(String name);

	String getName();
}
